package com.kk.xhr.model.service;

import com.kk.xhr.common.pojo.EmployeeStatusEnum;
import com.kk.xhr.model.dto.EducationExperienceModifyRequestDTO;
import com.kk.xhr.model.dto.EmployeeDTO;
import com.kk.xhr.model.dto.EmployeeQueryRequestDTO;
import com.kk.xhr.model.dto.JobExperienceModifyRequestDTO;
import com.kk.xhr.model.dto.PageDto;
import com.kk.xhr.model.dto.PrizeExperienceModifyRequestDTO;
import com.kk.xhr.model.dto.ProjectExperienceModifyRequestDTO;
import com.kk.xhr.model.entity.EducationExperience;
import com.kk.xhr.model.entity.JobExperience;
import com.kk.xhr.model.entity.PrizeExperience;
import com.kk.xhr.model.entity.ProjectExperience;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

/**
 * employee 接口
 *
 * @author luokexiong
 * @version 1.0 2021/2/14
 * @since 1.0.0
 */
public interface IEmployeeService {

    /**
     * 添加员工信息
     *
     * @param dto EmployeeDTO
     * @return 主键id
     */
    long add(EmployeeDTO dto);

    /**
     * 添加获奖经历
     *
     * @param prize 获奖经历
     * @return id
     */
    long addPrize(PrizeExperience prize);

    /**
     * 添加教育经历
     *
     * @param education 教育经历
     * @return id
     */
    long addEducation(EducationExperience education);

    /**
     * 添加项目经历
     *
     * @param project 项目经历
     * @return id
     */
    long addProject(ProjectExperience project);

    /**
     * 添加工作经历
     *
     * @param job 工作经历
     * @return id
     */
    long addJob(JobExperience job);

    /**
     * 分页查询
     *
     * @param dto 查询dto
     * @return employee dto
     */
    PageDto<EmployeeDTO> query(EmployeeQueryRequestDTO dto);

    /**
     * 根据id查询employee
     *
     * @param userId 用户id
     * @return employee dto
     */
    Optional<EmployeeDTO> queryByUserId(Long userId);

    /**
     * 根据员工id查询工作经历
     *
     * @param employeeId 员工id
     * @return 工作经历 列表
     */
    List<JobExperience> queryJob(Long employeeId);

    /**
     * 根据员工id查询获奖经历
     *
     * @param employeeId 员工id
     * @return 获奖经历o 列表
     */
    List<PrizeExperience> queryPrize(Long employeeId);

    /**
     * 根据员工id查询教育经历
     *
     * @param employeeId 员工id
     * @return 教育经历dto 列表
     */
    List<EducationExperience> queryEducation(Long employeeId);

    /**
     * 根据员工id查询项目经历
     *
     * @param employeeId 员工id
     * @return 项目经历 列表
     */
    List<ProjectExperience> queryProject(Long employeeId);

    /**
     * 根据id和状态更新
     *
     * @param id     员工id
     * @param status 状态
     * @return 是否更新成功
     */
    boolean modify(Long id, EmployeeStatusEnum status);

    /**
     * 修改员工信息
     *
     * @param dto EmployeeDTO
     * @return 是否更新成功
     */
    boolean modify(EmployeeDTO dto);

    /**
     * 修改工作经历
     *
     * @param dto JobExperienceModifyRequestDTO
     * @return 是否成功
     */
    boolean modifyJob(JobExperienceModifyRequestDTO dto);

    /**
     * 修改获奖经历
     *
     * @param dto PrizeExperienceModifyRequestDTO
     * @return 是否成功
     */
    boolean modifyPrize(PrizeExperienceModifyRequestDTO dto);

    /**
     * 修改教育经历
     *
     * @param dto EducationExperienceModifyRequestDTO
     * @return 是否成功
     */
    boolean modifyEducation(EducationExperienceModifyRequestDTO dto);

    /**
     * 修改项目经历
     *
     * @param dto ProjectExperienceModifyRequestDTO
     * @return 是否成功
     */
    boolean modifyProject(ProjectExperienceModifyRequestDTO dto);

    /**
     * 删除工作经历
     *
     * @param id 主键id
     * @return 是否成功
     */
    boolean removeJob(Long id);

    /**
     * 删除获奖经历
     *
     * @param id 主键id
     * @return 是否成功
     */
    boolean removePrize(Long id);

    /**
     * 删除教育经验
     *
     * @param id 主键id
     * @return 是否成功
     */
    boolean removeEducation(Long id);

    /**
     * 删除项目经历
     *
     * @param id 主键id
     * @return 是否成功
     */
    boolean removeProject(Long id);

    /**
     * 批量插入工作经历
     *
     * @param jobs 工作经历集合
     * @return 数量
     */
    int batchAddJob(Collection<JobExperience> jobs);

    /**
     * 批量插入工作经历
     *
     * @param prizes 工作经历集合
     * @return 数量
     */
    int batchAddPrize(Collection<PrizeExperience> prizes);

    /**
     * 批量插入工作经历
     *
     * @param educations 工作经历集合
     * @return 数量
     */
    int batchAddEdu(Collection<EducationExperience> educations);

    /**
     * 批量插入工作经历
     *
     * @param projects 工作经历集合
     * @return 数量
     */
    int batchAddProject(Collection<ProjectExperience> projects);
}
